#include "BlockQueue.hpp"
#include <unistd.h>




// 1.单消费 单生产
// 2.多消费 多生产



// 2.
#include <functional>

using func_t = std::function<void()>;

void DownLoad(){
    std::cout << "this is download" << std::endl;
}

template<class T>
void* Product(void* args){
    BlockQueue<T>* pbq = static_cast<BlockQueue<T>*>(args);
    while(1){
        func_t task = DownLoad;
        std::cout << "productor : 发送了一个任务"  << std::endl;
        pbq->Push(task);
        // 为了看清楚效果不得以这么做
        sleep(1);
    }
    return nullptr;
}

template<class T>
void* Consume(void* args){
    BlockQueue<T>* pbq = static_cast<BlockQueue<T>*>(args);
    while(1){
        T task = pbq->Pop();
        std::cout << "consumer : 接收一个任务" << std::endl;

        // 2.执行任务
        task();
        
        // 为了看清楚效果不得以这么做
        sleep(20);
    }
    return nullptr;
}


int main(){
    BlockQueue<func_t>* pbq = new BlockQueue<func_t>;

    pthread_t consumer1, consumer2, consumer3;
    pthread_t productor1, productor2;

    pthread_create(&productor1, nullptr, Product<func_t>, pbq);
    pthread_create(&productor2, nullptr, Product<func_t>, pbq);
    pthread_create(&consumer1, nullptr, Consume<func_t>, pbq);
    pthread_create(&consumer2, nullptr, Consume<func_t>, pbq);
    pthread_create(&consumer3, nullptr, Consume<func_t>, pbq);

    pthread_join(consumer1, nullptr);
    pthread_join(consumer2, nullptr);
    pthread_join(consumer3, nullptr);

    pthread_join(productor1, nullptr);
    pthread_join(productor2, nullptr);

    return 0;
} 